clipboard: Make value getters set the passed in value
authorBenjamin Otte <otte@redhat.com>
Fri, 24 Nov 2017 05:07:09 +0000 (06:07 +0100)
committerBenjamin Otte <otte@redhat.com>
Sun, 3 Dec 2017 04:46:47 +0000 (05:46 +0100)
Don't return a const GValue, that's ugly API. Instead require people to
pass in a preinitialized GValue and set that one.

gdk/gdkclipboard.c
gdk/gdkcontentdeserializer.c
gdk/gdkcontentdeserializer.h

index 2b37270315c1b8b5361d103b8a1b2b88b6a62a73..bd213625ff9cdc79584b4619b83ea7fa784174b0 100644 (file)
@@ -347,13 +347,14 @@ gdk_clipboard_read_value_done (GObject      *source,
 {
   GTask *task = data;
   GError *error = NULL;
-  const GValue *value;
+  GValue *value;
+
+  value = g_task_get_task_data (task);
 
-  value = gdk_content_deserialize_finish (result, &error);
-  if (value == NULL)
+  if (!gdk_content_deserialize_finish (result, value, &error))
     g_task_return_error (task, error);
   else
-    g_task_return_pointer (task, (gpointer) value, NULL);
+    g_task_return_pointer (task, value, NULL);
 
   g_object_unref (task);
 }
@@ -377,7 +378,7 @@ gdk_clipboard_read_value_got_stream (GObject      *source,
 
   gdk_content_deserialize_async (stream,
                                  mime_type,
-                                 GPOINTER_TO_SIZE (g_task_get_task_data (task)),
+                                 G_VALUE_TYPE (g_task_get_task_data (task)),
                                  g_task_get_priority (task),
                                  g_task_get_cancellable (task),
                                  gdk_clipboard_read_value_done,
@@ -385,6 +386,13 @@ gdk_clipboard_read_value_got_stream (GObject      *source,
   g_object_unref (stream);
 }
 
+static void
+free_value (gpointer value)
+{
+  g_value_unset (value);
+  g_slice_free (GValue, value);
+}
+
 static void
 gdk_clipboard_read_value_internal (GdkClipboard        *clipboard,
                                    GType                type,
@@ -396,6 +404,7 @@ gdk_clipboard_read_value_internal (GdkClipboard        *clipboard,
 {
   GdkContentFormatsBuilder *builder;
   GdkContentFormats *formats;
+  GValue *value;
   GTask *task;
 
   builder = gdk_content_formats_builder_new ();
@@ -406,7 +415,9 @@ gdk_clipboard_read_value_internal (GdkClipboard        *clipboard,
   task = g_task_new (clipboard, cancellable, callback, user_data);
   g_task_set_priority (task, io_priority);
   g_task_set_source_tag (task, source_tag);
-  g_task_set_task_data (task, GSIZE_TO_POINTER (type), NULL);
+  value = g_slice_new0 (GValue);
+  g_value_init (value, type);
+  g_task_set_task_data (task, value, free_value);
 
   gdk_clipboard_read_internal (clipboard,
                                formats,
index bcfc11e7e16f02b9ff0d8f3fbd9010b72daf1bb8..6c931e09787d8b9691241ddba67cef23575d1c33 100644 (file)
@@ -380,25 +380,27 @@ gdk_content_deserialize_async (GInputStream        *stream,
                                 user_data);
 }
 
-const GValue *
+gboolean
 gdk_content_deserialize_finish (GAsyncResult  *result,
+                                GValue        *value,
                                 GError       **error)
 {
   GdkContentDeserializer *deserializer;
 
-  g_return_val_if_fail (GDK_IS_CONTENT_DESERIALIZER (result), NULL);
-  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
+  g_return_val_if_fail (GDK_IS_CONTENT_DESERIALIZER (result), FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
   deserializer = GDK_CONTENT_DESERIALIZER (result);
+  g_return_val_if_fail (G_VALUE_HOLDS (value, G_VALUE_TYPE (&deserializer->value)), FALSE);
 
   if (deserializer->error)
     {
       if (error)
         *error = g_error_copy (deserializer->error);
-      return NULL;
+      return FALSE;
     }
 
-  return &deserializer->value;
+  g_value_copy (&deserializer->value, value);
+  return TRUE;
 }
 
 /*** DESERIALIZERS ***/
index 481f15a8389d2989da8f50e647f7088d25a744d0..102a4bcc4ee1a1e1e33883af59158fae4bce10c8 100644 (file)
@@ -81,7 +81,8 @@ void                    gdk_content_deserialize_async                   (GInputS
                                                                          GAsyncReadyCallback     callback,
                                                                          gpointer                user_data);
 GDK_AVAILABLE_IN_3_94
-const GValue *          gdk_content_deserialize_finish                  (GAsyncResult           *result,
+gboolean                gdk_content_deserialize_finish                  (GAsyncResult           *result,
+                                                                         GValue                 *value,
                                                                          GError                **error);